#pragma once
#include <vector>
#include "GridGenerator.h"

// 网格延拓参数
struct ExtendParams {
    int numExtendX = 5;      // X方向两侧网格延拓数量
    int numExtendY = 5;      // Y方向两侧网格延拓数量
    int numExtendUp = 4;     // Z方向网格向上延拓数量
    int numExtendDown = 4;   // Z方向网格向下延拓数量
    double ratioX = 0.1;     // X方向网格延拓距离倍数
    double ratioY = 0.1;     // Y方向网格延拓距离倍数
    double upElevation = 1200.0;    // Z方向网格向上延拓至海拔高度(m)
    double downElevation = -1000.0; // Z方向网格向下延拓至海拔高度(m)
};

// 添加新的结构体用于传递网格尺寸
struct GridSizes {
    double dx;  // X方向实际网格尺寸
    double dy;  // Y方向实际网格尺寸
    double dz;  // Z方向实际网格尺寸
};

class MeshExtender {
public:
    MeshExtender(std::vector<Point3D>& nodes, 
                 std::vector<Tetrahedron>& elements,
                 const ExtendParams& params,
                 const GridSizes& gridSizes);
    
    // 执行网格延拓
    void extend();
    
    // 获取单元区域标记
    const std::vector<int>& getCellZones() const { return cellZones_; }

    // 获取延拓后的节点和单元
    const std::vector<Point3D>& getNodes() const { return nodes_; }
    const std::vector<Tetrahedron>& getElements() const { return elements_; }

private:
    // 计算延拓尺寸
    void computeExtendSizes();
    
    // 生成围岩区域网格
    void generateSurroundingRock();
    
    // 生成上覆岩石区域网格
    void generateOverlyingRock();
    
    // 生成上覆围岩区域网格
    void generateOverlyingSurroundingRock();
    
    // 生成下覆岩石区域网格
    void generateUnderlyingRock();
    
    // 生成下覆围岩区域网格
    void generateUnderlyingSurroundingRock();
    
    // 在指定区域生成六面体网格
    void generateHexMesh(
        double x_start, double x_end, double x_size,
        double y_start, double y_end, double y_size,
        double z_start, double z_end, double z_size,
        int zone_type);
    
    // 将六面体剖分为四面体
    std::vector<Tetrahedron> splitHexToTets(const std::vector<size_t>& hexNodes);
    
    std::vector<Point3D>& nodes_;
    std::vector<Tetrahedron>& elements_;
    std::vector<int> cellZones_;
    ExtendParams params_;
    GridSizes gridSizes_;  // 添加新成员存储网格尺寸
    
    // 储层范围
    double x_min_, x_max_;
    double y_min_, y_max_;
    double z_min_, z_max_;
    
    // 延拓尺寸
    double delta_reservoir_x_;
    double delta_reservoir_y_;
    double delta_reservoir_z_;
    double extend_size_x_;
    double extend_size_x_middle_;
    double extend_size_y_;
    double extend_size_y_middle_;
    double extend_size_z_up_;
    double extend_size_z_down_;
    double extend_size_z_middle_;
}; 